package cn.coders.net.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;


/**
 * Service接口 - Service接口基类
 */

public interface BaseService<T, PK extends Serializable> {

    /**
     * 根据ID获取实体对象.
     * 
     * @param id
     *            记录ID
     * @return 实体对象
     */
    public T get(PK id);


    /**
     * 根据ID获取实体对象.
     * 
     * @param id
     *            记录ID
     * @return 实体对象
     */
    public T load(PK id);


    /**
     * 根据ID数组获取实体对象集合.
     * 
     * @param ids
     *            ID对象数组
     * 
     * @return 实体对象集合
     */
    public List<T> get(PK[] ids);


    /**
     * 根据属性名和属性值获取实体对象.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            属性值
     * @return 实体对象
     */
    public T get(String propertyName, Object value);


    /**
     * 根据属性名和属性值获取实体对象.
     * 
     * @param propertiesMap
     *            属性键值对
     * @return 实体对象
     */
    public T get(Map<String, Object> propertiesMap);


    /**
     * 根据属性名和属性值获取实体对象集合. 查询的值为propertyName==value
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            属性值
     * @return 实体对象集合
     */
    public List<T> getNoList(String propertyName, Object value);


    /**
     * 根据属性名和属性值获取实体对象集合. 查询的值为propertyName!=value
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            属性值
     * @return 实体对象集合
     * 
     */
    public List<T> getList(String propertyName, Object value);


    /**
     * 根据属性名和属性值获取实体对象集合. 查询的值为propertyName!=value
     * 
     * @param propertyMap属性列表
     * @return 实体对象集合
     */
    public List<T> getNoList(Map<String, Object> propertyMap);


    /**
     * 根据属性名和属性值获取实体对象集合. 查询的值为propertyName!=value
     * 
     * @param propertyMap属性列表
     * @return 实体对象集合
     * 
     */
    public List<T> getList(Map<String, Object> propertyMap);


    /**
     * 获取所有实体对象集合.
     * 
     * @return 实体对象集合
     */
    public List<T> getAll();


    /**
     * 获取所有实体对象总数.
     * 
     * @return 实体对象总数
     */
    public Long getTotalCount();


    /**
     * 获取所有实体对象总数.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            值
     * 
     * @return 实体对象总数
     * 
     */
    public Long getTotalCount(String propertyName, Object value);


    /**
     * 获取所有实体对象总数 and 关系.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            值
     * 
     * @param whereName
     *            属性名称
     * @param whereObject
     *            值
     * 
     * @return 实体对象总数
     */
    public Long getTotalCount(String propertyName, Object value, String whereName, Object whereObject);


    /**
     * 统计某一列的和
     * */
    public Double getSumTotal(String propertySum);


    /**
     * 获得传入属性的总量
     * 
     * @param propertySum
     *            要求和的列名
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            值
     * 
     * @return 实体对象总数
     * */
    public Double getSumTotal(String propertySum, String propertyName, Object value);


    /**
     * 根据属性名、修改前后属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).
     * 
     * @param propertyName
     *            属性名称
     * @param oldValue
     *            修改前的属性值
     * @param oldValue
     *            修改后的属性值
     * @return boolean
     */
    public boolean isUnique(String propertyName, Object oldValue, Object newValue);


    /**
     * 根据属性名判断数据是否已存在.
     * 
     * @param propertyName
     *            属性名称
     * @param value
     *            值
     * @return boolean
     */
    public boolean isExist(String propertyName, Object value);


    /**
     * 保存实体对象.
     * 
     * @param entity
     *            对象
     * @return ID
     */
    public PK save(T entity);


    /**
     * 更新实体对象.
     * 
     * @param entity
     *            对象
     */
    public void update(T entity);


    public void merge(T entity);


    /**
     * 删除实体对象.
     * 
     * @param entity
     *            对象
     * @return
     */
    public void delete(T entity);


    /**
     * 根据ID删除实体对象.
     * 
     * @param id
     *            记录ID
     */
    public void delete(PK id);


    /**
     * 根据ID数组删除实体对象.
     * 
     * @param ids
     *            ID数组
     */
    public void delete(PK[] ids);


    /**
     * 刷新session.
     * 
     */
    public void flush();


    /**
     * 清除Session.
     * 
     */
    public void clear();


    /**
     * 清除某一对象.
     * 
     * @param object
     *            需要清除的对象
     */
    public void evict(Object object);


    //
    // /**
    // * 根据Page对象进行查询(提供分页、查找、排序功能).
    // *
    // * @param page
    // * Page对象
    // * @return Page对象
    // */
    // public Pager findByPager(Pager pager);
    //
    //
    // /**
    // * 根据Pager和DetachedCriteria对象进行查询(提供分页、查找、排序功能).
    // *
    // * @param pager
    // * Pager对象
    // * @return Pager对象
    // */
    // public Pager findByPager(Pager pager, DetachedCriteria detachedCriteria);

    /**
     * 按分组查总记录数
     * */
    public Long getTotalCountGroupByProerty(String groupByName);


    public T like(String propertyName, Object value);


    public List<T> find(Class object, String filedName, String whereStr, String orderbyStr, String groupByStr);


    // public <T> List<T> listObjectByPageInfor(Class<T> object, String
    // filedName, String whereStr,
    // String orderBystr, String groupByStr, PageInfo pageInfor);

    public Long getTotalCount(Map<String, Object> propertyMap);


    public List findBySql(String sql);


    public int findTotalSQL(String hql);

    // public PageInfo findByPageInfo(PageInfo pager);
    //
    //
    // public PageInfo findByPageInfo(PageInfo pager, DetachedCriteria
    // detachedCriteria);
}
